package day15.ZiXi;

public class Desk01 {
    //定义一个标记
    //true 就表示桌子上有汉堡包的,此时允许吃货执行
    //false 就表示桌子上没有汉堡包的,此时允许厨师执行
    //public static boolean flag = false;
    private boolean flag;
    //汉堡包的总数量
    //public static int count = 10;
    //以后我们在使用这种必须有默认值的变量
    // private int count = 10;
    private  int count;
    //锁对象
    private final Object lock = new Object();
    public Desk01(){
        this(false,10);
    }
    public Desk01(boolean flag,int count){
        this.flag=flag;
        this.count=count;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public Object getLock() {
        return lock;
    }

    @Override
    public String toString() {
        return "Desk01{" +
                "flag=" + flag +
                ", count=" + count +
                ", lock=" + lock +
                '}';
    }
}
class Cooker01 extends Thread{
    private Desk01 desk01;
    public Cooker01(Desk01 desk01){
        this.desk01= desk01;
    }
    //    生产者步骤：
//            1，判断桌子上是否有汉堡包
//    如果有就等待，如果没有才生产。
//            2，把汉堡包放在桌子上。
//            3，叫醒等待的消费者开吃。

    @Override
    public void run() {
        while (true){
            synchronized (desk01.getLock()){
                if (desk01.getCount()==0){
                    break;
                }else {
                    if (!desk01.isFlag()){
                        System.out.println("厨师正在生产汉堡包");
                        desk01.setFlag(true);
                        desk01.getLock().notifyAll();
                    }else{
                        try {
                            desk01.getLock().wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        }
    }
}
class Foodie01 extends Thread{
    private Desk01 desk01;
    public Foodie01(Desk01 desk01){
        this.desk01 = desk01;
    }

    @Override
    public void run() {
        while (true){
            synchronized (desk01.getLock()){
                if (desk01.getCount()==0){
                    break;
                }else {
                    if (desk01.isFlag()){
                        System.out.println("吃货再吃汉堡包");
                        desk01.setFlag(false);
                        desk01.getLock().notifyAll();
                        desk01.setCount(desk01.getCount()-1);
                    }else {
                        try {
                            desk01.getLock().wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}
class Demo01{
    public static void main(String[] args) {
        /*消费者步骤：
        1，判断桌子上是否有汉堡包。
        2，如果没有就等待。
        3，如果有就开吃
        4，吃完之后，桌子上的汉堡包就没有了
                叫醒等待的生产者继续生产
        汉堡包的总数量减一*/

        /*生产者步骤：
        1，判断桌子上是否有汉堡包
        如果有就等待，如果没有才生产。
        2，把汉堡包放在桌子上。
        3，叫醒等待的消费者开吃。*/
        Desk01 desk01 = new Desk01();
        Foodie01 f = new Foodie01(desk01);
        Cooker01 c = new Cooker01(desk01);
        f.start();
        c.start();
    }
}